package com.hliushi.creation;

/**
 * @author llhuang10
 * @date 2021/8/19 13:48
 */
public class _02FactoryMethod {


    public static void main(String[] args) throws Exception {
        LoggerFactory factory;
        Logger logger;

        // 可引入配置文件实现
        // String className = PropertiesUtil.getProp("className", "creation/_01Factory.properties");
        // Class<?> aClass = Class.forName(className);
        // factory = (LoggerFactory) aClass.newInstance();
        factory = new FileLoggerFactory();
        logger = factory.createLogger();
        logger.writeLog();


    }


    /**
     * 日志记录器接口: 抽象产品
     */
    interface Logger {
        void writeLog();
    }

    /**
     * 日志记录器工厂接口: 抽象工厂
     */
    interface LoggerFactory {
        Logger createLogger();

        Logger createLogger(String args);

        Logger createLogger(Object obj);
    }

    /**
     * 数据库日志记录器: 具体产品
     */
    static class DatabaseLogger implements Logger {

        @Override
        public void writeLog() {
            System.out.println("数据库日志记录.");
        }
    }

    /**
     * 文件日志记录器: 具体产品
     */
    static class FileLogger implements Logger {
        @Override
        public void writeLog() {
            System.out.println("文件日志记录.");
        }
    }

    /**
     * 数据库日志记录器工厂类: 具体工厂
     */
    static class DataBaseLoggerFactory implements LoggerFactory {
        @Override
        public Logger createLogger() {
            // todo 连接数据库
            // 创建数据库日志记录器对象
            Logger databaseLogger = new DatabaseLogger();
            // todo 初始化数据库日志记录器...
            return databaseLogger;
        }

        public Logger createLogger(String args) {
            // 使用参数args作为连接字符串来连接数据库，代码省略
            Logger logger = new DatabaseLogger();
            // 初始化数据库日志记录器，代码省略
            return logger;
        }

        public Logger createLogger(Object obj) {
            // 使用封装在参数obj中的连接字符串来连接数据库，代码省略
            Logger logger = new DatabaseLogger();
            // 使用封装在参数obj中的数据来初始化数据库日志记录器，代码省略
            return logger;
        }
    }

    /**
     * 文件日志记录器工厂类: 具体工厂
     */
    static class FileLoggerFactory implements LoggerFactory {
        @Override
        public Logger createLogger() {
            // 创建文件日志记录器对象
            Logger fileLogger = new FileLogger();
            // todo 创建文件
            return fileLogger;
        }

        public Logger createLogger(String args) {
            Logger logger = new FileLogger();
            // 初始化日志日志记录器，代码省略
            return logger;
        }

        public Logger createLogger(Object obj) {
            Logger logger = new FileLogger();
            // 使用封装在参数obj中的数据来初始化日志日志记录器，代码省略
            return logger;
        }
    }


}
